﻿procedure;
var 
  PP_SL, PP_SLEx : TStringList;
  PP_DS : TAppDataSet;
  PP_AtrID, PP_AtrDSID, PP_AtrNDID, PP_ClassID, PP_LoginID, PP_Value, Sel : String;
  PP_Index : Integer;
  
  SLDel_LuP : TStringList;
  DS_LuP  : TAppDataSet;
  ID_LuP, SearchStr_LuP : String;
  Index_LuP : Integer;
  Date_LuP : DateTime;

  MP_DSParam: TAppDataSet;
  MP_IDMM: String;  
  
  LG_SL : TStringList;

  MP_SLPrvky: TStringList;
  MP_PIN, MP_NazevP: String;
  MP_Index: Integer;  
 
var //AV
  AV_DS: TAppDataSet;
  AV_SL: TStringList;
// var AV konec

var //MaSu
  MS_SL, MS_SLData: TStringList;
  MS_DS: TAppDataSet;
  MS_IDDT, MS_ICTridy, MS_UTridy, MS_IDTVS, MS_IDDS, MS_IDVazba, MS_TypTVS, MS_NDN,
  MS_IDNapVV, MS_IDProcessCont: string;
  i: integer;
  
var //AV2
  AV2_DS: TAppDataSet;
  AV2_SL: TStringList;
  AV2_from, AV2_to, AV2_to_prev: DateTime;
  AV2_first: Boolean;
// var AV2 konec

var // AV3
  AV3_SLJob: TStringList;
  AV3_DSOccupation: TAppDataSet;
  AV3_index: Integer;
  AV3_date: DateTime;
  AV3_msg_text: String;
// var AV3 konec

////////// procedures & functions - begin //////////
procedure ReplaceID_LuP(ClassID_LuP, AtrID_LuP, Code_LuP, NewID_LuP : String);
var
  SL_LuP : TStringList;
  ID_LuP : String;
begin
  DS_LuP.Filter := '("' + AtrID_LuP + '" = ''' + Code_LuP + ''')';
  if not DS_LuP.IsEmpty then begin
    ID_LuP := DS_LuP.GetKeyValue('', ftIDB);
    SL_LuP := TStringList.Create;
    try
      while not DS_LuP.EOF do begin
        SL_LuP.Clear;
        SL_LuP.Add('ic_b=' + LByID(NewID_LuP));
        SL_LuP.Add('u_b=' + RByID(NewID_LuP));
        AppServer.UpdateDBRecord(SourceName, '', ClassID_LuP, DS_LuP.GetKeyValue('', ftID), SL_LuP);
        //
        DS_LuP.Next;
      end;
    finally
      SL_LuP.Free;
    end;
  end;
end;

procedure PrekopirujDoHorniVazebniDT_MaSu(SpodniDT, HorniDT:string);
var
  IDA,IDB: string;
begin
  MS_SL.Clear;
  StringToSL(AppServer.GetDBKeyValues(Sourcename,rmPrimary,SpodniDT,''),';',MS_SL); 
  i := 0;
  while i < MS_SL.Count do
  begin
    if not AppServer.ExistDBKeyValue(SourceName,rmPrimary,HorniDT,MS_SL.Strings[i],ftID) then
    begin
      IDA := AppServer.GetDBKeyValue(SourceName,rmPrimary,SpodniDT,MS_SL.Strings[i],ftID,ftIDA);
      IDB := AppServer.GetDBKeyValue(SourceName,rmPrimary,SpodniDT,MS_SL.Strings[i],ftID,ftIDB);
      MS_SLData.Clear;
      MS_SLData.Values['ic'] := LByID(MS_SL.Strings[i]);
      MS_SLData.Values['u'] := RByID(MS_SL.Strings[i]);
      MS_SLData.Values['ic_a'] := LByID(IDA);
      MS_SLData.Values['u_a'] := RByID(IDA);
      MS_SLData.Values['ic_b'] := LByID(IDB);
      MS_SLData.Values['u_b'] := RByID(IDB);
      AppServer.InsertDBRecord(SourceName,'',HorniDT,true,MS_SLData);
    end;
    i := i + 1;
  end;
end;

function JeToCislo_MaSu(Cislo: string): boolean;
var
  j: integer;
  pismeno: string;
begin
  if cislo <> '' then
  begin
    Result := true;
    while (j < CharLength(Cislo)) and (Result = true) do
    begin
      pismeno := SubString(Cislo,j,1);
      if (pismeno <> '0') and (pismeno <> '1') and (pismeno <> '2') and (pismeno <> '3') and (pismeno <> '4') and 
         (pismeno <> '5') and (pismeno <> '6') and (pismeno <> '7') and (pismeno <> '8') and (pismeno <> '9') then
        Result := false;
      j := j + 1;
    end;
  end;
end;

function NajdiHlavniDS_MaSu(IDPF: string): string;
var
  IDDSPF: string;
begin
  if AppServer.ExistDBKeyValue(SourceName,rmPrimary,'121,0',IDPF,ftID) then
  begin
    IDDSPF := AppServer.GetDBLinkKeyValue(SourceName,rmPrimary,'110,0','900,0',IDPF);//ID kořene - použité datové řezy
    if IDDSPF <> '' then 
    begin
      IDDSPF := AppServer.GetDBKeyValue(SourceName,rmPrimary,'2162,0',IDDSPF,ftIDA,ftIDB); // zjisti DSPF hlavních DŘ (může jich být více)
      if (IDDSPF <> '') and (GetElemCount(IDDSPF, ';') = 1) then
        Result := AppServer.GetDBKeyValue(SourceName,rmPrimary,'110,0',IDDSPF,ftID,ftIDA); // DŘ hlavního DŘ
    end;
  end;
end;

function GetNapVV_MaSu(IDTVS, IDProcess: string; Vstup:Boolean): string;
var
  NapVVs: String;
  index: integer;
begin
  if Vstup then
    index := MS_SL.IndexOfName(IDTVS+';'+IDProcess+';'+'1')
  else
    index := MS_SL.IndexOfName(IDTVS+';'+IDProcess+';'+'0');
      
  if index <> -1 then
    Result := MS_SL.ValueByIndex(index)
  else
  begin
    if Vstup then
    begin
      NapVVs := AppServer.GetDBLinkKeyValue(SourceName,rmPrimary,'6313667,10',IDProcess,IDTVS);
      if GetElemCount(NapVVs,';') = 1 then
        Result := NapVVs;
    end else
    begin
      NapVVs := AppServer.GetDBLinkKeyValue(SourceName,rmPrimary,'6313668,10',IDProcess,IDTVS);
      if GetElemCount(NapVVs,';') = 1 then
        Result := NapVVs;
    end;
    if Result <> '' then
    begin
      if Vstup then 
        MS_SL.Values[IDTVS+';'+IDProcess+';'+'1'] := Result
      else
        MS_SL.Values[IDTVS+';'+IDProcess+';'+'0'] := Result;
    end;
  end;
end;
  
function GetProcessContext_MaSu(IDProcess, IDProcessUp: string): string;
var
  ProcessConts: String;
  index: integer;
begin
  index := MS_SL.IndexOfName(IDProcess+';'+IDProcessUp);
  if index <> -1 then
    Result := MS_SL.ValueByIndex(index)
  else
  begin
    ProcessConts := AppServer.GetDBLinkKeyValue(SourceName,rmPrimary,'227676,10',IDProcess,IDProcessUp);
    if GetElemCount(ProcessConts,';') = 1 then
      Result := ProcessConts;
    if Result <> '' then
      MS_SL.Values[IDProcess+';'+IDProcessUp] := Result;
  end;
end;
////////// procedures & functions - end //////////

begin
  // AV3 - Kontrola překryvů dat u obsazení pracovního místa - NESPOUSTET
  // Je první, protože má v sobě exception
  AV3_SLJob := TStringList.Create;
  AV3_DSOccupation := TAppDataSet.Create;
  try
    AV3_DSOccupation.SetDSParams(SourceName, rmPrimary, '20026530,10', dsaReadNonVisible, '', '', '', '"20026533,10" is not NULL'); // DS ma v sobe order by na datum OD
    AV3_DSOccupation.Open;
    //
    while not AV3_DSOccupation.EOF do
    begin
      AV3_date := Trunc(AV3_DSOccupation.FieldByName('20026533,10').AsDateTime);
      if AppServer.GetDBKeyValues(SourceName, rmPrimary, '160,0', 
                                  Format('("ic" <> %% OR "u" <> %%) AND "ic_a" = %% AND "u_a" = %% AND "ic_b" = %% AND "u_b" = %% AND "233868,10" >= ''%%'' AND "233868,10" < ''%%''',
                                         [AV3_DSOccupation.FieldByName('ic').AsString, AV3_DSOccupation.FieldByName('u').AsString,
                                          AV3_DSOccupation.FieldByName('ic_a').AsString, AV3_DSOccupation.FieldByName('u_a').AsString,
                                          AV3_DSOccupation.FieldByName('ic_b').AsString, AV3_DSOccupation.FieldByName('u_b').AsString,
                                          DateTimeToANSIStr(AV3_date), DateTimeToANSIStr(AV3_date + 1)]))
         <> '' then
      begin
        if AV3_SLJob.IndexOf(AV3_DSOccupation.GetKeyValue('', ftIDA)) = -1 then
          AV3_SLJob.Add(AV3_DSOccupation.GetKeyValue('', ftIDA));
      end;
      AV3_DSOccupation.Next;
    end;
    //
    if AV3_SLJob.Count <> 0 then
    begin
      while AV3_index <> AV3_SLJob.Count do
      begin
        AV3_SLJob.Strings[AV3_index] := Format('%% - %%',
                                               [AppServer.GetDBAtrValue(SourceName, rmPrimary, MainLang, '149,0', '33654,10', AV3_SLJob.Strings[AV3_index]),
                                                AppServer.GetDBAtrValue(SourceName, rmPrimary, MainLang, '130,0', '18734,10', AV3_SLJob.Strings[AV3_index])]);
        AV3_index := AV3_index + 1;
      end;
      //
      if MainLang = '402,0' then
        AV3_msg_text :=
'Reinstallation is not possible.
Some job positions and their occupancy have been detected with the following problem, which cannot be fixed through reinstallation.
The job position is occupied twice by the same person, with the start date of one occupancy having the same date part as the end of another occupancy for the same job position.
Problems have been detected in these job positions:'
      else
        AV3_msg_text :=
'Reinstalaci není možné provést.
U některých pracovních míst a jejich obsazení byly detekován následující problém, který není možný v rámci reinstalace opravit.
Pracovní místo je obsazeno dvakrát jednou osobou a to tak, že začátek jednoho obsazení má stejnou datumovou složku jako konec jiného obsazení stejného pracovního místa.
Problémy byly detekovány u těchto pracovních míst:';
      //
      raise EException.Create(pReadOnly, '12838,0', AV3_msg_text, SLToString(AV3_SLJob, #13#10) + #13#10);
    end;
  finally
    AV3_SLJob.Free;
    AV3_DSOccupation.Free;
  end;
  // AV3 - KONEC

  // LG Add new attribute to database attributes (must be inserted before reinstall, otherwise error when trying to fill it before insert to 103,0)
  if not AppServer.ExistDBKeyValue(SourceName,rmPrimary, '102,0', '39335059,10', ftID) then
  begin
    LG_SL := TStringList.Create;
    try
      LG_SL.Add('ic=39335059');
      LG_SL.Add('u=10');
      LG_SL.Add('222,0=12');
      LG_SL.Add('221,1=name');
      LG_SL.Add('2240,0=0');
      LG_SL.Add('244,0=0');
      LG_SL.Add('2204,0=3');
      LG_SL.Add('2205,0=1');
      LG_SL.Add('2257,0=3');
      AppServer.InsertDBRecord(SourceName,'401,0','102,0',false,LG_SL);
      LG_SL.Clear;
      LG_SL.Add('ic=39335060');
      LG_SL.Add('u=10');
      LG_SL.Add('ic_a=102');
      LG_SL.Add('u_a=0');
      LG_SL.Add('ic_b=39335059');
      LG_SL.Add('u_b=10');
      AppServer.InsertDBRecord(SourceName,'','103,0',false,LG_SL);
    finally
      LG_SL.Free;
    end; 
  end;
  
  AppServer.SetSQLScript(SourceName,TargetPath + 'Reinstall_1090BI.sql');
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  M17059359_10;  // NEMAZAT, STANDARDNI SOUCAST REINSTALACE
  AppServer.SetSQLScript(SourceName,TargetPath + 'Reinstall_1090AD.sql');
  
  // ZdSt - nastaveni napoctu "Neodpr.hod.-dovolena" u MS 510 - SPUSTIT
  if (legislation = '745998,10') then
    if AppServer.ExistDBKeyValue(SourceName, rmPrimary, '461844,10', '2155017,9') then
      AppServer.SetDBAtrValue(SourceName, UserLang, '461844,10', '462012,10', '2155017,9', '0');
  // ZdSt konec
  
  
  // PeM - kopírování hodnot plovoucíh parametrů do PP pro uživatele - NESPOUSTET  
  PP_SL := TStringList.Create;
  try
    //** DEFINICE: ID atributu ze třídy podřízené třídě "Plovoucí parametry uživatele (647106,10)" = ID nedatabázového atributu, který je použit jako pam. proměnná
    PP_SL.Add('1189939,10=39335875,10');
    PP_SL.Add('1532745,10=39335881,10');
    PP_SL.Add('1532749,10=39335885,10');
    PP_SL.Add('1532747,10=39335887,10');
    
    //Výkup
    PP_SL.Add('1166118,10=39336110,10'); //ZZN - Kód odběratele
    PP_SL.Add('1166121,10;IC=39336115,10'); //ZZN - ID odběratele => IC
    PP_SL.Add('1166121,10;U=39336116,10'); //ZZN - ID odběratele => U
    PP_SL.Add('1174010,10=39336394,10'); //ZZN - Název řady vážního lístku
    PP_SL.Add('1174003,10;IC=39336401,10'); // ZZN - ID řady vážního lístku => IC
    PP_SL.Add('1174003,10;U=39336403,10'); // ZZN - ID řady vážního lístku => U
    PP_SL.Add('1174012,10=39336384,10'); // ZZN - Název řady sou. roz. listu
    PP_SL.Add('1174005,10;IC=39336390,10'); // ZZN - ID řady sou. roz. listu => IC
    PP_SL.Add('1174005,10;U=39336392,10'); // ZZN - ID řady sou. roz. listu => U
    PP_SL.Add('1198996,10=39336447,10'); // ZZN - Název řady měřicího protokolu
    PP_SL.Add('1198998,10;IC=39336454,10'); // ZZN - ID řady měřicího protokolu => IC
    PP_SL.Add('1198998,10;U=39336456,10'); // ZZN - ID řady měřicího protokolu => U
    PP_SL.Add('1165702,10=39336030,10'); // ZZN - Název řady dodacího listu přijatého
    PP_SL.Add('1165889,10;IC=39336044,10'); // ZZN - ID řady dodacího listu přijatého => IC
    PP_SL.Add('1165889,10;U=39336124,10'); // ZZN - ID řady dodacího listu přijatého => U
    PP_SL.Add('1262443,10=39336214,10'); // ZZN - Název řady dodacího listu vydaného
    PP_SL.Add('1262441,10;IC=39336211,10'); // ZZN - ID řady dodacího listu vydaného => IC
    PP_SL.Add('1262441,10;U=39336217,10'); // ZZN - ID řady dodacího listu vydaného => U
    PP_SL.Add('1199000,10=39336458,10'); // ZZN - Datum Od
    PP_SL.Add('1199002,10=39336468,10'); // ZZN - Datum Do
    
    PP_DS := TAppDataSet.Create;
    try
      PP_DS.SetDSParams(SourceName, rmPrimary, '647125,10', dsaReadNonVisible);
      PP_DS.NoMacros := true;
      while PP_Index < PP_SL.Count do begin
        PP_AtrID := PP_SL.Names[PP_Index];
        
        Sel := '';
        if GetElemCount(PP_AtrID,';') = 2 then
        begin
          Sel := ElemByIndex(PP_AtrID,1,';'); 
          PP_AtrID := ElemByIndex(PP_AtrID,0,';');                                         
        end;
                
        PP_ClassID := AppServer.GetDBKeyValue(SourceName, rmPrimary, '103,0', PP_AtrID, ftIDB, ftIDA);
        if PP_ClassID <> '' then begin
          PP_AtrDSID := AppServer.GetFNByP(SourceName, '647125,10', PP_AtrID);
          if PP_AtrDSID <> '' then begin
            PP_AtrNDID := PP_SL.ValueByIndex(PP_Index);
            PP_DS.Filter := '("' + PP_AtrDSID + '" is not null)';
            PP_DS.Open;
            while not PP_DS.EOF do begin
              PP_LoginID := PP_DS.GetKeyValue('', ftID);
              PP_Value := AppServer.GetDBAtrValue(SourceName, rmPrimary, UserLang, PP_ClassID, PP_AtrID, PP_LoginID);
              if AppServer.GetDBLinkKeyValue(SourceName, rmPrimary, '2102,0', PP_AtrNDID, PP_LoginID) = '' then begin
                PP_SLEx := TStringList.Create;
                try
                  PP_SLEx.Add('ic_a=' + LByID(PP_AtrNDID));
                  PP_SLEx.Add('u_a=' + RByID(PP_AtrNDID));
                  PP_SLEx.Add('ic_b=' + LByID(PP_LoginID));
                  PP_SLEx.Add('u_b=' + RByID(PP_LoginID));
                  case
                    Sel = '': PP_SLEx.Add('2420,0=' + PP_Value);
                    Sel = 'IC': PP_SLEx.Add('2420,0=' + LbyID(PP_Value));
                    Sel = 'U': PP_SLEx.Add('2420,0=' + RbyID(PP_Value));
                  end;
                  AppServer.InsertDBRecord(SourceName, '', '2102,0', false, PP_SLEx);
                finally
                  PP_SLEx.Free;
                end;
              end;
              //
              PP_DS.Next;
            end;
            PP_DS.Close;
          end;
        end;
        //
        PP_Index := PP_Index + 1;
      end;
    finally
      PP_DS.Free;
    end;
  finally
    PP_SL.Free;  
  end; 
  // PeM - konec
  
  
  // AV - Nová nadřízená třída obsazení pracovního místa - NESPOUŠTĚT
  AV_DS := TAppDataSet.Create;
  AV_SL := TStringList.Create;
  try
    AV_DS.SetDSParams(SourceName, rmPrimary, '39456128,10', dsaReadNonVisible);
    AV_DS.Open;
    while not AV_DS.EOF do
    begin
      if not AppServer.ExistDBKeyValue(SourceName, rmPrimary, '39456122,10', AV_DS.GetPKValue, ftID) then
      begin
        AV_SL.Clear;
        AV_SL.Values['ic']          := AV_DS.FieldByName('ic').AsString;
        AV_SL.Values['u']           := AV_DS.FieldByName('u').AsString;
        AV_SL.Values['ic_a']        := AV_DS.FieldByName('ic_a').AsString;
        AV_SL.Values['u_a']         := AV_DS.FieldByName('u_a').AsString;
        AV_SL.Values['ic_b']        := AV_DS.FieldByName('ic_b').AsString;
        AV_SL.Values['u_b']         := AV_DS.FieldByName('u_b').AsString;
        AV_SL.Values['39456123,10'] := AV_DS.FieldByName('39456131,10').AsANSIString;
        AV_SL.Values['39456125,10'] := AV_DS.FieldByName('39456130,10').AsANSIString;
        AppServer.InsertDBRecord(SourceName, '', '39456122,10', true, AV_SL);
      end;
      //
      AV_DS.Next;
    end;
  finally
    AV_DS.Free;
    AV_SL.Free;
  end;
  // AV - konec
  
  //LuP - 01: prevazani dodacich podminek obchodnich partneru na distribuovane zaznamy (NESPOUSTET)
  DS_LuP := TAppDataSet.Create;
  try
    DS_LuP.SetDSParams(SourceName, rmPrimary, '39351517,10', dsaReadNonVisible);
    DS_LuP.OpenEmpty;
    ReplaceID_LuP('14940310,10', '39351525,10', 'EXW', '2406203,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'FCA', '2406204,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'CPT', '2406205,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'CIP', '2406206,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'DAP', '2406207,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'DPU', '2406208,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'DDP', '2406209,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'FAS', '2406210,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'FOB', '2406211,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'CFR', '2406212,9');
    ReplaceID_LuP('14940310,10', '39351525,10', 'CIF', '2406213,9');
    DS_LuP.Close;
    //
    DS_LuP.SetDSParams(SourceName, rmPrimary, '39351518,10', dsaReadNonVisible);
    DS_LuP.OpenEmpty;
    ReplaceID_LuP('3771672,10', '39351527,10', 'EXW', '2406203,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'FCA', '2406204,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'CPT', '2406205,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'CIP', '2406206,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'DAP', '2406207,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'DPU', '2406208,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'DDP', '2406209,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'FAS', '2406210,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'FOB', '2406211,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'CFR', '2406212,9');
    ReplaceID_LuP('3771672,10', '39351527,10', 'CIF', '2406213,9');
    DS_LuP.Close;
    //
    //vymaz vazby na skupiny dodacich podminek s uzlem jinym nez 9
    DS_LuP.SetDSParams(SourceName, rmPrimary, '1119637,10', dsaReadNonVisible);
    DS_LuP.NoMacros := true;
    DS_LuP.Filter := '("6101265,10.ic" is not null) and ("6101265,10.u" <> 9)';
    DS_LuP.Open;
    while not DS_LuP.EOF do begin
      AppServer.DeleteDBRecord(SourceName, '6084526,10', DS_LuP.GetKeyValue('6101265,10', ftID), false);
      //
      DS_LuP.Next;
    end;
    //vymaz dodacich podminek s uzlem 11 a zneplatneni nedistribuovanych dodacich podminek
    DS_LuP.Filter := '("u" <> 9)';
    while not DS_LuP.EOF do begin
      if DS_LuP.FieldByName('u').AsString = '11' then
        AppServer.DeleteDBRecord(SourceName, '1119632,10', DS_LuP.GetKeyValue('', ftID), false)
      else
        AppServer.SetDBAtrValue(SourceName, '', '1119632,10', '39455821,10', DS_LuP.GetKeyValue('', ftID), '2022-12-31');
      //
      DS_LuP.Next;
    end;
  finally
    DS_LuP.Free;
  end;
  //LuP - 01: end
  
  //LuP - 02: naplneni casu v datu inventur skladu - NESPOUSTET
  DS_LuP := TAppDataSet.Create;
  try
    DS_LuP.SetDSParams(SourceName, rmPrimary, '38943730,10', dsaReadNonVisible);
    DS_LuP.Open;
    while not DS_LuP.EOF do begin
      Date_LuP := DS_LuP.FieldByName('38943753,10').AsDateTime;
      Date_LuP := Date_LuP + EncodeTime(23, 59, 59, 0);
      AppServer.SetDBAtrValue(SourceName, '', '411452,10', '38943743,10', DS_LuP.GetKeyValue('', ftID), DateTimeToANSIStr(Date_LuP));
      // 
      DS_LuP.Next;
    end;
  finally
    DS_LuP.Free;
  end;
  //LuP - 02: end  
  
  // MP - naplnění atributu "Způsob výpočtu z posledního parametru"   - NESPOUŠTĚT
  // Oprava generování odečtů na odběrném místě s odpojeným vodoměrem
  MP_DSParam := TAppDataSet.Create;
  try
    // všechna MM s platným parametrem k akt. datu
    MP_DSParam.SetDSParams(SourceName, rmPrimary, '211900,10103', dsaReadNonVisible); // "Parametry odběrů odběrného místa vodárenství" 
    // platný param -> vzorec
    // FIltr : platné parametry 
    MP_DSParam.OrderBy := '"211908,10103" DESC';
    MP_DSParam.Filter := Format('"211941,10103.ic" is not null AND "1085615,10103" is null AND ("211908,10103" <= ''%%'' and ("211909,10103" >= ''%%'' or "211909,10103" is null)) ', 
                       [DateToANSIStr(SysDate), DateToANSIStr(SysDate)]);
    MP_DSParam.Open;
    while not MP_DSParam.EOF do // 
    begin
      //MP_DSParam.Edit;
      //MP_DSParam.FieldByName('1085615,10103').AsInteger := MP_DSParam.FieldByName('213612,10103').AsANSIString; // způsob výpočtu
      //MP_DSParam.PostNoConfirm;
      AppServer.SetDBAtrValue(SourceName, '', '226435,10103', '1085607,10103', MP_DSParam.GetKeyValue('211941,10103', ftID), MP_DSParam.FieldByName('213612,10103').AsANSIString);      
      MP_DSParam.Next;
    end;
       
    // MM (bez nastaveného způsobu výpočtu) bez aktuálně platného parametru - najít poslední platný parametr
    MP_DSParam.Filter := Format('"211941,10103.ic" is not null AND "1085615,10103" is null AND  "211909,10103" <= ''%%'' ', 
                       [DateToANSIStr(SysDate)]);
    while not MP_DSParam.EOF do // 
    begin
      if MP_IDMM <> MP_DSParam.GetKeyValue('211941,10103', ftID) then
      begin  // nové MM (změna ID na MM)
        MP_IDMM := MP_DSParam.GetKeyValue('211941,10103', ftID);
        AppServer.SetDBAtrValue(SourceName, '', '226435,10103', '1085607,10103', MP_DSParam.GetKeyValue('211941,10103', ftID), MP_DSParam.FieldByName('213612,10103').AsANSIString);
      end;
      MP_DSParam.Next;
    end;                                        
  finally
    MP_DSParam.Free;
  end;  
  // MP end
  
  //MaSu1 - Úpravy workflow - vstupy, výstupy - NESPOUŠTĚT
  MS_SL := TStringList.Create;
  MS_SLData := TStringList.Create;
  try
    //Programová funkce pro výběr --> Programová funkce vstupu/výstupu
    PrekopirujDoHorniVazebniDT_MaSu('10840248,10','39523223,10');
    //Programová funkce pro zobrazení --> Programová funkce vstupu/výstupu
    PrekopirujDoHorniVazebniDT_MaSu('10776417,10','39523223,10');
    
    MS_NDN := GetUserGlobals('', '647187,10', '');
    if MS_NDN <> '' then
    begin
      MS_SL.Clear;
      StringToSL(AppServer.GetDBKeyValues(Sourcename,rmPrimary,'10776417,10',Format('"u"=%%',[MS_NDN])),';',MS_SL);
      i := 0;
      while i < MS_SL.Count do
      begin
        MS_IDTVS := AppServer.GetDBKeyValue(SourceName,rmPrimary,'10776417,10',MS_SL.Strings[i],ftID,ftIDA);
        MS_TypTVS := AppServer.GetDBAtrValue(SourceName,rmPrimary,'','6313666,10','26038088,10',MS_IDTVS);
        MS_IDDT := '';
        MS_ICTridy := AppServer.GetDBAtrValue(SourceName,rmPrimary,'','10776417,10','17471771,10',MS_SL.Strings[i]);
        MS_UTridy := AppServer.GetDBAtrValue(SourceName,rmPrimary,'','10776417,10','17471774,10',MS_SL.Strings[i]);
        if JeToCislo_MaSu(MS_ICTridy) and JeToCislo_MaSu(MS_UTridy) then
        begin
          if not AppServer.ExistDBKeyValue(SourceName,rmPrimary,'107,0',MS_ICTridy + ',' + MS_UTridy,ftID) then
          begin
            MS_ICTridy := '';
            MS_UTridy := '';
          end;
        end else
        begin
          MS_ICTridy := '';
          MS_UTridy := '';
        end;
        MS_IDDS := NajdiHlavniDS_MaSu(AppServer.GetDBKeyValue(SourceName,rmPrimary,'10776417,10',MS_SL.Strings[i],ftID,ftIDB));
        //Atributy IC třídy a U třídy --> Synchronizace formuláře vstupu/výstupu
        if (MS_ICTridy <> '') and (MS_UTridy <> '') then
          if AppServer.GetDBKeyValue(SourceName,rmPrimary,'39523225,10',MS_SL.Strings[i],ftIDA,ftID) = '' then
          begin
            MS_SLData.Clear;
            MS_SLData.Values['ic_a'] := LByID(MS_SL.Strings[i]);
            MS_SLData.Values['u_a'] := RByID(MS_SL.Strings[i]);
            MS_SLData.Values['ic_b'] := MS_ICTridy;
            MS_SLData.Values['u_b'] := MS_UTridy;
            AppServer.InsertDBRecord(SourceName,'','39523225,10',true,MS_SLData);
          end;
        //Vstup/výstup je typu objekt nebo kolekce objektů
        if (MS_TypTVS = '0') or (MS_TypTVS = '1') then
        begin
          if MS_IDDS <> '' then
            if AppServer.GetDBKeyValue(SourceName,rmPrimary,'39523224,10',MS_IDTVS,ftIDA,ftID) = '' then
            begin
              //Hlavní DŘ formuláře pro zobrazení --> Datový řez vstupu/výstupu
              MS_SLData.Clear;
              MS_SLData.Values['ic_a'] := LByID(MS_IDTVS);
              MS_SLData.Values['u_a'] := RByID(MS_IDTVS);
              MS_SLData.Values['ic_b'] := LByID(MS_IDDS);
              MS_SLData.Values['u_b'] := RByID(MS_IDDS);
              AppServer.InsertDBRecord(SourceName,'','39523224,10',true,MS_SLData);
              MS_IDVazba := MS_SLData.Values['ic'] + ',' + MS_SLData.Values['u'];
              //Synchronizace --> Synchronizace datového řezu vstupu/výstupu
              if (MS_ICTridy <> '') and (MS_UTridy <> '') then
                if AppServer.GetDBKeyValue(SourceName,rmPrimary,'107,0',MS_ICTridy+','+MS_UTridy,ftID,ftIDA) = MS_IDDS then
                begin
                  MS_SLData.Clear;
                  MS_SLData.Values['ic_a'] := LByID(MS_IDVazba);
                  MS_SLData.Values['u_a'] := RByID(MS_IDVazba);
                  MS_SLData.Values['ic_b'] := MS_ICTridy;
                  MS_SLData.Values['u_b'] := MS_UTridy;
                  AppServer.InsertDBRecord(SourceName,'','39523226,10',true,MS_SLData);
                end;
            end;
          //Synchronizace nebo hlavní třída DŘ --> Objekt vstupu/výstupu
          if AppServer.GetDBKeyValue(SourceName,rmPrimary,'6412186,10',MS_IDTVS,ftIDA,ftID) = '' then
          begin
            if (MS_ICTridy <> '') and (MS_UTridy <> '') then
              MS_IDDT := AppServer.GetDBKeyValue(SourceName,rmPrimary,'107,0',MS_ICTridy+','+MS_UTridy,ftID,ftIDB)
            else
              if MS_IDDS <> '' then
              begin
                MS_IDDT := AppServer.GetDBKeyValues(Sourcename,rmPrimary,'107,0',Format('("ic_a"=%%)and("u_a"=%%)and("263,0"=1)',[LByID(MS_IDDS),RByID(MS_IDDS)]));
                if GetElemCount(MS_IDDT, ';') = 1 then
                  MS_IDDT := AppServer.GetDBKeyValue(SourceName,rmPrimary,'107,0',MS_IDDT,ftID,ftIDB)
                else
                  MS_IDDT := '';
              end;
            if MS_IDDT <> '' then
            begin
              MS_SLData.Clear;
              MS_SLData.Values['ic_a'] := LByID(MS_IDTVS);
              MS_SLData.Values['u_a'] := RByID(MS_IDTVS);
              MS_SLData.Values['ic_b'] := LByID(MS_IDDT);
              MS_SLData.Values['u_b'] := RByID(MS_IDDT);
              AppServer.InsertDBRecord(SourceName,'','6412186,10',true,MS_SLData);
            end;
          end;
        end;
        i := i + 1;
      end;
    end;
  finally
    MS_SL.Free;
    MS_SLData.Free;
  end;
  ////MaSu1 - end
  
  // AV2 - Zmena datumu na pracovnich mistech z datumovo casovych na datumove - NESPOUSTET
  AV2_DS := TAppDataSet.Create;
  AV2_SL := TStringList.Create;
  try
    StringToSL(AppServer.GetDBKeyValues(SourceName, rmPrimary, '157,0', '1=1'), ';', AV2_SL);
    AV2_DS.SetDSParams(SourceName, rmPrimary, '39501499,10', dsaFullNonVisible, '157,0', '0,0', 'ID_A=ID', '', '"39501521,10" ASC');
    AV2_DS.OpenEmpty;
    while AV2_SL.Count <> 0 do
    begin
      AV2_DS.MasterIDParent := AV2_SL.Strings[0];
      AV2_first := true;
      while not AV2_DS.EOF do
      begin
        AV2_from := Trunc(AV2_DS.FieldByName('39501521,10').AsDateTime);
        AV2_to := Trunc(AV2_DS.FieldByName('39501522,10').AsDateTime);
        if AV2_first then
        begin
          AV2_first := false;
          if (AV2_DS.FieldByName('39501521,10').AsDateTime <> AV2_from) or (AV2_DS.FieldByName('39501522,10').AsDateTime <> AV2_to) then
          begin
            AV2_DS.Edit;
            if AV2_from <> 0 then
              AV2_DS.FieldByName('39501521,10').AsDateTime := AV2_from;
            if AV2_to <> 0 then
              AV2_DS.FieldByName('39501522,10').AsDateTime := AV2_to;
            AV2_DS.PostNoConfirm;
          end;
        end else
        begin
          if AV2_from <= AV2_to_prev then
          begin
            AV2_from := DateAdd(dpDay, 1, AV2_from);
            if AV2_to <> 0 then if AV2_from > AV2_to then
              AV2_to := AV2_from;
          end;
          if (AV2_DS.FieldByName('39501521,10').AsDateTime <> AV2_from) or (AV2_DS.FieldByName('39501522,10').AsDateTime <> AV2_to) then
          begin
            AV2_DS.Edit;
            AV2_DS.FieldByName('39501521,10').AsDateTime := AV2_from;
            if AV2_to <> 0 then
              AV2_DS.FieldByName('39501522,10').AsDateTime := AV2_to;
            AV2_DS.PostNoConfirm;
          end;
        end;
        AV2_to_prev := AV2_to;
        AV2_DS.Next;
      end;
      AV2_SL.Delete(0);
    end;
    //
    {AV2_DS.Close;
    AV2_DS.SetDSParams(SourceName, rmPrimary, '39501499,10', dsaEditNonVisible, '', '', '', '"39501505,10.ic" is NULL AND "39501505,10.u" is NULL');
    AV2_DS.Open;
    while not AV2_DS.EOF do
    begin
      AV2_DS.Edit;
      AV2_DS.FieldByName('39501505,10.ic').AsString   := AV2_DS.FieldByName('ic').AsString;
      AV2_DS.FieldByName('39501505,10.u').AsString    := AV2_DS.FieldByName('u').AsString;
      AV2_DS.FieldByName('39501505,10.ic_a').AsString := AV2_DS.FieldByName('ic_a').AsString;
      AV2_DS.FieldByName('39501505,10.u_a').AsString  := AV2_DS.FieldByName('u_a').AsString;
      AV2_DS.FieldByName('39501505,10.ic_b').AsString := AV2_DS.FieldByName('ic_b').AsString;
      AV2_DS.FieldByName('39501505,10.u_b').AsString  := AV2_DS.FieldByName('u_b').AsString;
      AV2_DS.FieldByName('39501523,10').AsString      := AV2_DS.FieldByName('39501521,10').AsString;
      AV2_DS.FieldByName('39501524,10').AsString      := AV2_DS.FieldByName('39501522,10').AsString;
      AV2_DS.PostNoConfirm;
      AV2_DS.Next;
    end;}
  finally
    AV2_DS.Free;
    AV2_SL.Free;
  end;
  // AV2 - END
  
  //VKo - NESPOUŠTĚT
  M39562277_10;
  //VKo - end
  
  // AV3 - prepocet struktury nadrizenych osob pro pristupova prava - NESPOUSTET
  M29212145_10;
  // AV3 - END
  
  //MaSu2 - Úpravy workflow - realizace vzorů - NESPOUŠTĚT
  MS_DS := TAppDataSet.Create;
  MS_SLData := TStringList.Create;
  MS_SL := TStringList.Create;
  try
    //Reinstall 109.0 - Realizace vzoru vstupu/výstupu
    MS_DS.SetDSParams(SourceName,rmPrimary,'39592717,10', dsaReadNonVisible);
    MS_DS.Filter := '(((("39592726,10.ic" is not null) and (("39592859,10" is null) or (("39592859,10"<>2) and ("39592859,10"<>3) and ("39592859,10"<>5))))) or 
                    (("39592724,10.ic" is not null) and (("39592860,10" is null) or (("39592860,10"<>2) and ("39592860,10"<>3) and ("39592860,10"<>5))))) and
                   ("39592732,10"=1)and("39592748,10.ic" is null)and
                   ((("39592737,10"=1)and("39592726,10.ic" is not null))or("39592724,10.ic" is not null))and
                   (("39592849,10.ic" is not null)or("39592850,10.ic" is not null))';
    MS_DS.Open;
    while not MS_DS.EOF do
    begin
      MS_IDNapVV := GetNapVV_MaSu(MS_DS.GetKeyValue('',ftIDB), MS_DS.GetKeyValue('39592733,10',ftIDA),not MS_DS.FieldByName('39592849,10.ic').IsNull);
      if MS_IDNapVV <> '' then
      begin
        MS_SLData.Clear;
        MS_SLData.Values['ic_a'] := LByID(MS_IDNapVV);
        MS_SLData.Values['u_a'] := RByID(MS_IDNapVV);
        MS_SLData.Values['ic_b'] := MS_DS.FieldByName('ic').AsString; 
        MS_SLData.Values['u_b'] := MS_DS.FieldByName('u').AsString;
        AppServer.InsertDBRecord(SourceName,'','39559347,10',false,MS_SLData);
      end;
      MS_DS.Next;
    end;
    MS_DS.Close;
    //Reinstall 109.0 - Realizace vzoru stromu akcí
    MS_DS.SetDSParams(SourceName,rmPrimary,'39633642,10', dsaReadNonVisible);
    MS_DS.Filter := '(("39633682,10" is null) or (("39633682,10"<>2) and ("39633682,10"<>3) and ("39633682,10"<>5))) and
                  ("39633662,10.ic" is null) and
                  ((("39633681,10"=1)and("39633673,10.ic" is not null))or("39633672,10.ic" is not null))';
    MS_DS.Open;
    while not MS_DS.EOF do
    begin
      MS_IDProcessCont := GetProcessContext_MaSu(MS_DS.GetKeyValue('39633674,10',ftIDA), MS_DS.GetKeyValue('39633675,10',ftIDA));
      if MS_IDProcessCont <> '' then
      begin
        MS_SLData.Clear;
        MS_SLData.Values['ic_a'] := LByID(MS_IDProcessCont);
        MS_SLData.Values['u_a'] := RByID(MS_IDProcessCont);
        MS_SLData.Values['ic_b'] := MS_DS.FieldByName('ic').AsString; 
        MS_SLData.Values['u_b'] := MS_DS.FieldByName('u').AsString;
        AppServer.InsertDBRecord(SourceName,'','39559346,10',false,MS_SLData);
      end;
      MS_DS.Next;
    end;
  finally
    MS_DS.Free;
    MS_SLData.Free;
    MS_SL.Free;
  end;
  //MaSu2 - END
  
  // MP - Kopírování hodnot atributu  "xPIN" (17819,10218) do nadřízeného atributu  "PIN" (39759107,10) a "xSpecifikace karty" (1260201,10)    - nespouštět
  MP_SLPrvky := TStringList.Create;
  try
    StringToSL(AppServer.GetDBKeyValues(SourceName, rmPrimary, '17811,10218', '"17819,10218" is not null '), ';', MP_SLPrvky); // "Identifikační prvky přístupu a docházky" - "xPIN" je vyplněný
    MP_Index := 0;
    while MP_Index < MP_SLPrvky.Count do
    begin
      MP_PIN := AppServer.GetDBAtrValue(SourceName, rmPrimary, '', '17811,10218', '17819,10218', MP_SLPrvky.Strings[MP_Index]);
      AppServer.SetDBAtrValue(SourceName, '', '1260198,10', '39759107,10', MP_SLPrvky.Strings[MP_Index], MP_PIN);  //  "Identifikační prvky" - "PIN"
      MP_Index := MP_Index + 1;
    end;
    
    MP_SLPrvky.Clear;
    // prvky s vyplněným atributem
    StringToSL(AppServer.GetDBKeyValues(SourceName, rmPrimary, '1260198,10', '"1260201,10" is not null '), ';', MP_SLPrvky); // "Identifikační prvky" - "xSpecifikace karty" 
    MP_Index := 0;
    while MP_Index < MP_SLPrvky.Count do
    begin
      MP_NazevP := AppServer.GetDBAtrValue(SourceName, rmPrimary, '', '1260198,10', '1260201,10', MP_SLPrvky.Strings[MP_Index]);
      AppServer.SetDBAtrValue(SourceName, '', '131,0', '236,1', MP_SLPrvky.Strings[MP_Index], MP_NazevP);  //  "Hmotné a nehmotné statky" - "Název statku"
      MP_Index := MP_Index + 1;
    end;
         
  finally
    MP_SLPrvky.Free;  
  end;
  // MP - end 
end.
